#include "tejo.h"
#include "pad.h"
#include "pantalla.h"

tejo::tejo( SDL_Surface* buffer) :
	 circulo("tejooo"), speed(0), angle(0), bufferSurface(buffer) {


	this->ubicacionNueva.w = (int) (pasajeEntero(2 * getRadio(), 1)	) + 1;
	this->ubicacionNueva.h = this->ubicacionNueva.w;
	this->ubicacionNueva.x = (int) (pasajeEntero(getCentro().getX()- getRadio(), 1) );
	this->ubicacionNueva.y = (int) (pasajeEntero(getCentro().getY()- getRadio(), 1) );

}
tejo::tejo(punto centro, double radio,SDL_Surface* buffer) :
	circulo(centro, radio ), speed(0), angle(0), bufferSurface(buffer)

{
	this->ubicacionNueva.w = (int) (pasajeEntero(2 * getRadio(), 1)) + 1;
	this->ubicacionNueva.h = this->ubicacionNueva.w;
	this->ubicacionNueva.x = (int) (pasajeEntero(getCentro().getX()- getRadio(), 1) );
	this->ubicacionNueva.y = (int) (pasajeEntero(getCentro().getY()- getRadio(), 1) );

}

tejo::~tejo()
{
}

void tejo::setSpeed(double speedy)
{
	if (speedy < 0) {
		speed = CONST_SPEEDY;
	} else {
		speed = speedy;
	}
}

double tejo::getSpeed() {
	return speed;
}

void tejo::setAngle(double angles) {
	angle = angles;
	while (angle < 0)
		angle += (2.0 * PI);
	while (angle > 2.0 * PI)
		angle -= (2.0 * PI);
}

double tejo::getAngle() {
	return angle;
}

void tejo::clear() {
SDL_Surface* screen = pantalla::getPantalla();

	SDL_BlitSurface(this->bufferSurface, &this->ubicacionNueva, screen,	&this->ubicacionNueva);
}

bool tejo::nuevaUbicacionTejo() {
	//SDL_Surface* screen = pantalla::getPantalla();

	int largo_pantalla = 500;
	int ancho_pantalla = 1000;
	double deltaX = getSpeed() * cos(getAngle());
	double deltaY = getSpeed() * sin(getAngle());
	double nuevaUbicacionTejoY = getCentro().getY() - deltaY;
	double nuevaUbicacionTejoX = getCentro().getX() + deltaX;

	if (nuevaUbicacionTejoY + getRadio() > largo_pantalla || nuevaUbicacionTejoY - getRadio() 	< largo_pantalla * 0.0625 ) 
	{
		double nAngle = PI - this->getAngle();
		if (nuevaUbicacionTejoY - getRadio() < largo_pantalla * 2) {
			nAngle = nAngle + PI;
		} else if (nuevaUbicacionTejoY + getRadio() > largo_pantalla) {
			return true;
		}
		this->setAngle(nAngle);
		deltaX = getSpeed() * cos(getAngle());
		deltaY = getSpeed() * sin(getAngle());
		nuevaUbicacionTejoY = getCentro().getY() - deltaY;
		nuevaUbicacionTejoX = getCentro().getX() + deltaX;
	}

	//angulo cuando choca con la pared x
	if (nuevaUbicacionTejoX + getRadio() > ancho_pantalla || nuevaUbicacionTejoX - getRadio() 	< 0 ) 
	{
		double nAngle = PI - this->getAngle();  //darlo 
		if (nuevaUbicacionTejoX - getRadio() < ancho_pantalla ) {
			nAngle = nAngle;  //+pi
		} else if (nuevaUbicacionTejoX + getRadio() > ancho_pantalla) {
			return true;
		}
		this->setAngle(nAngle);
		deltaX = getSpeed() * cos(getAngle());
		deltaY = getSpeed() * sin(getAngle());
		nuevaUbicacionTejoY = getCentro().getY() - deltaY;
		nuevaUbicacionTejoX = getCentro().getX() + deltaX;
	}



/*	if( nuevaUbicacionTejoX + getRadio() > screen->w	|| nuevaUbicacionTejoX - getRadio() < 0)
			{
		double nAngle = PI - this->getAngle();
		if (nuevaUbicacionTejoX - getRadio() < screen->w * 2) {
			nAngle = nAngle - PI;
		} else if (nuevaUbicacionTejoX + getRadio() > screen->w) {
			return true;
		}
		if (nAngle < 0) {
			nAngle = nAngle + (2 * PI);
		}


		deltaY = getSpeed() * cos(getAngle());
		deltaX = getSpeed() * sin(getAngle());
		nuevaUbicacionTejoY = getCentro().getY() - deltaY;
		nuevaUbicacionTejoX = getCentro().getX() + deltaX;
	}*/


	getCentro().setY(nuevaUbicacionTejoY);
	getCentro().setX(nuevaUbicacionTejoX);

	this->ubicacionNueva.x = (int) (pasajeEntero(getCentro().getX()		- getRadio(), 1) );
	this->ubicacionNueva.y = (int) (pasajeEntero(getCentro().getY()		- getRadio(), 1) );

	return false;

}


punto tejo::posicionNextTejo() {

	SDL_Surface* screen = pantalla::getPantalla();

	punto newPunto;
	double deltaX = getSpeed() * cos(getAngle());
	double deltaY = getSpeed() * sin(getAngle());
	double nuevaUbicacionTejoY = getCentro().getY() - deltaY;
	double nuevaUbicacionTejoX = getCentro().getX() + deltaX;
	if (nuevaUbicacionTejoY + getRadio() > screen->h || nuevaUbicacionTejoY - getRadio()		< screen->h * 0.0625 || nuevaUbicacionTejoX + getRadio() > screen->w	|| nuevaUbicacionTejoX - getRadio() < 0)
	{
		double nAngle = PI - this->getAngle();
		if (nuevaUbicacionTejoY - getRadio() < screen->h * 2) {
			nAngle = nAngle + PI;
		} else if (nuevaUbicacionTejoY + getRadio() > screen->h) {
			exit(0);
			nAngle = nAngle - PI;
		}
		if (nAngle < 0) {
			nAngle = nAngle + (2 * PI);
		}
		deltaX = getSpeed() * cos(getAngle());
		deltaY = getSpeed() * sin(getAngle());
		nuevaUbicacionTejoY = getCentro().getY() - deltaY;
		nuevaUbicacionTejoX = getCentro().getX() + deltaX;
	}
	newPunto.setY(nuevaUbicacionTejoY);
	newPunto.setX(nuevaUbicacionTejoX);

	return newPunto;
}

bool tejo::desplazar() {
	clear();
	bool perdioVida = nuevaUbicacionTejo();
	if (perdioVida) {
		return perdioVida;
	}
	graficar();
	return false;
}





bool tejo::desplazar_server() {
	bool perdioVida = nuevaUbicacionTejo();
	if (perdioVida) {
		return perdioVida;
	}
	return false;
}


//NO USAR DEL LADO SERVER
void tejo::setPCentro(punto centros)
{
	this->clear();//CLAUDIO
	this->centro = centros;
	this->ubicacionNueva.x = (int) (pasajeEntero(getCentro().getX()	- getRadio(), 1) );
	this->ubicacionNueva.y = (int) (pasajeEntero(getCentro().getY()	- getRadio(), 1) );
}

void tejo::setPCentroNoClear(punto centros)
{
	this->centro = centros;
	this->ubicacionNueva.x = (int) (pasajeEntero(getCentro().getX()	- getRadio(), 1) );
	this->ubicacionNueva.y = (int) (pasajeEntero(getCentro().getY()	- getRadio(), 1) );
}
